6.3 组 3:FP64 与 SFU(unit: fp64 + sfu,64 条)
binary64 运算与转换(R / R1)(23 条)
FADD
语法(Syntax)
fadd.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d64 = s1_64 + s2_64(binary64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fadd.f64 | R op opcode=0x1e f4=0x0 | fixed:16 | fm p64 |
FSUB
语法(Syntax)
fsub.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d64 = s1_64 - s2_64(binary64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fsub.f64 | R op opcode=0x1e f4=0x1 | fixed:16 | fm p64 |
FMUL
语法(Syntax)
fmul.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d64 = s1_64 * s2_64(binary64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fmul.f64 | R op opcode=0x1e f4=0x2 | fixed:16 | fm p64 |
FMIN
语法(Syntax)
fmin.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d = minimumNumber(s1_64, s2_64)(-0 < +0;单 NaN 返回另一操作数)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fmin.f64 | R op opcode=0x1e f4=0x3 | fixed:16 | fm p64 |
FMAX
语法(Syntax)
fmax.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d = maximumNumber(s1_64, s2_64)(-0 < +0;单 NaN 返回另一操作数)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fmax.f64 | R op opcode=0x1e f4=0x4 | fixed:16 | fm p64 |
FSGNJ
语法(Syntax)
fsgnj.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d = {s2.sign, s1[62:0]}(binary64 符号注入)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fsgnj.f64 | R op opcode=0x1e f4=0x5 | fixed:16 | fm p64 |
FSGNJN
语法(Syntax)
fsgnjn.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d = {~s2.sign, s1[62:0]}(binary64 符号注入)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fsgnjn.f64 | R op opcode=0x1e f4=0x6 | fixed:16 | fm p64 |
FSGNJX
语法(Syntax)
fsgnjx.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
描述:d = {s1.sign ^ s2.sign, s1[62:0]}(binary64 符号注入)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fsgnjx.f64 | R op opcode=0x1e f4=0x7 | fixed:16 | fm p64 |
FLDEXP
语法(Syntax)
fldexp.f64 rd:vp^2 rs1:vp^2 rs2:v
描述:d64 = s1_64 * 2^(int32)s2
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fldexp.f64 | R op opcode=0x1e f4=0x8 | fixed:16 | fm p64 |
FCLASS
语法(Syntax)
fclass.f64 rd:v rs1:v
描述:d = fclass(s1_64)(RISC-V 10 位掩码)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fclass.f64 | R1 op opcode=0x20 f11=0x0 | fixed:16 | fm p64 |
FFLOOR
语法(Syntax)
ffloor.f64 rd:vp^2 rs1:vp^2
描述:d = floor(s1_64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
ffloor.f64 | R1 op opcode=0x20 f11=0x1 | fixed:16 | fm p64 |
FCEIL
语法(Syntax)
fceil.f64 rd:vp^2 rs1:vp^2
描述:d = ceil(s1_64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fceil.f64 | R1 op opcode=0x20 f11=0x2 | fixed:16 | fm p64 |
FTRUNC
语法(Syntax)
ftrunc.f64 rd:vp^2 rs1:vp^2
描述:d = trunc(s1_64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
ftrunc.f64 | R1 op opcode=0x20 f11=0x3 | fixed:16 | fm p64 |
FRNDNE
语法(Syntax)
frndne.f64 rd:vp^2 rs1:vp^2
描述:d = round_half_even(s1_64)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
frndne.f64 | R1 op opcode=0x20 f11=0x4 | fixed:16 | fm p64 |
FFRACT
语法(Syntax)
ffract.f64 rd:vp^2 rs1:vp^2
描述:d = s1_64 - floor(s1_64)(钳到 < 1.0)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
ffract.f64 | R1 op opcode=0x20 f11=0x5 | fixed:16 | fm p64 |
FCVT
语法(Syntax)
fcvt.f64.f32 rd:vp^2 rs1:v
fcvt.f32.f64 rd:v rs1:vp^2
fcvt.i32.f64 rd:v rs1:vp^2
fcvt.u32.f64 rd:v rs1:vp^2
fcvt.f64.i32 rd:vp^2 rs1:v
fcvt.f64.u32 rd:vp^2 rs1:v
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
fcvt.f64.f32 | R1 op opcode=0x20 f11=0x6 | fixed:16 | d64 = double(s1)(精确;DAZ 看源宽度 32) | fm p64 |
fcvt.f32.f64 | R1 op opcode=0x20 f11=0x7 | fixed:16 | d = float(s1_64),MODE.rm | fm p64 |
fcvt.i32.f64 | R1 op opcode=0x20 f11=0x8 | fixed:16 | d = int32(s1_64),RTZ 饱和 | fm p64 |
fcvt.u32.f64 | R1 op opcode=0x20 f11=0x9 | fixed:16 | d = uint32(s1_64),RTZ 饱和 | fm p64 |
fcvt.f64.i32 | R1 op opcode=0x20 f11=0xa | fixed:16 | d64 = double(int32(s1))(精确) | fm p64 |
fcvt.f64.u32 | R1 op opcode=0x20 f11=0xb | fixed:16 | d64 = double(uint32(s1))(精确) | fm p64 |
FREXP
语法(Syntax)
frexp.mant.f64 rd:vp^2 rs1:vp^2
frexp.exp.f64 rd:v rs1:vp^2
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
frexp.mant.f64 | R1 op opcode=0x20 f11=0xc | fixed:16 | d = frexp 尾数([0.5,1);NaN/inf 原样透传、不置标志) | fm p64 |
frexp.exp.f64 | R1 op opcode=0x20 f11=0xd | fixed:16 | d = frexp 指数(int32;0/inf/NaN → 0) | fm p64 |
binary64 比较(C)(15 条)
CMP
语法(Syntax)
cmp.eq.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.ne.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.lt.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.le.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.gt.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.ge.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.o.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.u.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.equ.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.neu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.ltu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.leu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.gtu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.geu.f64 rd:u rs1:vp^2 rs2:vp^2
cmp.class.f64 rd:u rs1:vp^2 rs2:v
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
cmp.eq.f64 | C op opcode=0x2a f5=0x6 | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered == s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.ne.f64 | C op opcode=0x2a f5=0x7 | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered != s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.lt.f64 | C op opcode=0x2a f5=0x8 | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered < s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.le.f64 | C op opcode=0x2a f5=0x9 | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered <= s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.gt.f64 | C op opcode=0x2a f5=0xa | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered > s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.ge.f64 | C op opcode=0x2a f5=0xb | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered >= s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.o.f64 | C op opcode=0x2a f5=0xc | fixed:16 | U[d] = EXEC 内满足 s1_64 ordered(均非 NaN) s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.u.f64 | C op opcode=0x2a f5=0xd | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered(任一 NaN) s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.equ.f64 | C op opcode=0x2a f5=0xe | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered 或 == s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.neu.f64 | C op opcode=0x2a f5=0xf | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered 或 != s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.ltu.f64 | C op opcode=0x2a f5=0x10 | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered 或 < s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.leu.f64 | C op opcode=0x2a f5=0x11 | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered 或 <= s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.gtu.f64 | C op opcode=0x2a f5=0x12 | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered 或 > s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.geu.f64 | C op opcode=0x2a f5=0x13 | fixed:16 | U[d] = EXEC 内满足 s1_64 unordered 或 >= s2_64(binary64)的 lane 掩码 | re ur p64 |
cmp.class.f64 | C op opcode=0x2a f5=0x14 | fixed:16 | U[d] = EXEC 内 (fclass(s1_64) & s2) != 0 的 lane 掩码 | re ur p64 |
binary64 X 格式(2 条)
FFMA
语法(Syntax)
ffma.f64 rd:vp^2 rs1:vp^2 rs2:vp^2 rs3:vp^2 rm:rm neg:mod3 abs:mod3
描述:d64 = fma(s1_64, s2_64, s3_64)(显式 rm)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
ffma.f64 | X op opcode=0x1 f10=0x13 | fixed:16 | fm rmo p64 |
FCVT
语法(Syntax)
fcvt.f32.f64.m rd:v rs1:vp^2 rm:rm
描述:d = float(s1_64),显式 rm
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
fcvt.f32.f64.m | X op opcode=0x1 f10=0x1b | fixed:16 | fm rmo p64 |
SFU 近似(async:sfu)(16 条)
RCP
语法(Syntax)
rcp.f32 rd:v rs1:v
rcp.f64 rd:vp^2 rs1:vp^2
rcp.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
rcp.f32 | R1 op opcode=0x22 f11=0x0 | async:sfu | d = 1/s1(正确舍入) | ap fm |
rcp.f64 | R1 op opcode=0x22 f11=0x8 | async:sfu | d = 1/s1_64(正确舍入;恒 RNE、不做 DAZ/FTZ) | ap p64 |
rcp.f16 | H op opcode=0x9 f10=0x40 | async:sfu | d ≈ 1/s1(binary16;Vulkan 精度) | h16 ap fm |
RSQ
语法(Syntax)
rsq.f32 rd:v rs1:v
rsq.f64 rd:vp^2 rs1:vp^2
rsq.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
rsq.f32 | R1 op opcode=0x22 f11=0x1 | async:sfu | d ≈ 1/sqrt(s1)(忠实舍入,< 1 ulp) | ap fm |
rsq.f64 | R1 op opcode=0x22 f11=0x9 | async:sfu | d ≈ 1/sqrt(s1_64)(两步 RNE;恒 RNE;≥ 26 正确位) | ap p64 |
rsq.f16 | H op opcode=0x9 f10=0x41 | async:sfu | d ≈ 1/sqrt(s1)(binary16;忠实舍入) | h16 ap fm |
SQRT
语法(Syntax)
sqrt.f32 rd:v rs1:v
sqrt.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
sqrt.f32 | R1 op opcode=0x22 f11=0x2 | async:sfu | d = sqrt(s1)(正确舍入;Vulkan 精度) | ap fm |
sqrt.f16 | H op opcode=0x9 f10=0x42 | async:sfu | d ≈ sqrt(s1)(binary16;Vulkan 精度) | h16 ap fm |
EXP2
语法(Syntax)
exp2.f32 rd:v rs1:v
exp2.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
exp2.f32 | R1 op opcode=0x22 f11=0x3 | async:sfu | d ≈ 2^s1(≤ 1 ulp;Vulkan 界) | ap fm |
exp2.f16 | H op opcode=0x9 f10=0x43 | async:sfu | d ≈ 2^s1(binary16;Vulkan 精度) | h16 ap fm |
LOG2
语法(Syntax)
log2.f32 rd:v rs1:v
log2.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
log2.f32 | R1 op opcode=0x22 f11=0x4 | async:sfu | d ≈ log2(s1)([0.5,2] 内绝对误差 ≤ 2^-21,其余 ≤ 3 ulp) | ap fm |
log2.f16 | H op opcode=0x9 f10=0x44 | async:sfu | d ≈ log2(s1)(binary16;Vulkan 精度) | h16 ap fm |
SIN
语法(Syntax)
sin.f32 rd:v rs1:v
sin.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
sin.f32 | R1 op opcode=0x22 f11=0x5 | async:sfu | d ≈ sin(2pis1)(输入单位为圈;Vulkan 界) | ap fm |
sin.f16 | H op opcode=0x9 f10=0x45 | async:sfu | d ≈ sin(2pis1)(binary16;输入单位为圈) | h16 ap fm |
COS
语法(Syntax)
cos.f32 rd:v rs1:v
cos.f16 rd:h rs1:h
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
cos.f32 | R1 op opcode=0x22 f11=0x6 | async:sfu | d ≈ cos(2pis1)(输入单位为圈;Vulkan 界) | ap fm |
cos.f16 | H op opcode=0x9 f10=0x46 | async:sfu | d ≈ cos(2pis1)(binary16;输入单位为圈) | h16 ap fm |
除法与正确舍入平方根(async:sfu)(8 条)
FSQRT
语法(Syntax)
fsqrt.f32 rd:v rs1:v
fsqrt.f64 rd:vp^2 rs1:vp^2
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
fsqrt.f32 | R1 op opcode=0x22 f11=0x7 | async:sfu | d = sqrt(s1)(正确舍入,MODE.rm) | fm |
fsqrt.f64 | R1 op opcode=0x22 f11=0xa | async:sfu | d64 = sqrt(s1_64)(正确舍入,MODE.rm64) | fm p64 |
DIV
语法(Syntax)
div rd:v rs1:v rs2:v
描述:d = s1 /s s2(RISC-V:除零 → -1,INT_MIN/-1 → INT_MIN;永不陷阱)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
div | R op opcode=0x24 f4=0x0 | async:sfu | - |
DIVU
语法(Syntax)
divu rd:v rs1:v rs2:v
描述:d = s1 /u s2(除零 → 0xffffffff;永不陷阱)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
divu | R op opcode=0x24 f4=0x1 | async:sfu | - |
REM
语法(Syntax)
rem rd:v rs1:v rs2:v
描述:d = s1 %s s2(%0 → s1;永不陷阱)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
rem | R op opcode=0x24 f4=0x2 | async:sfu | - |
REMU
语法(Syntax)
remu rd:v rs1:v rs2:v
描述:d = s1 %u s2(%0 → s1;永不陷阱)
| 变体 | 编码 | 延迟 | 标志 |
|---|---|---|---|
remu | R op opcode=0x24 f4=0x3 | async:sfu | - |
FDIV
语法(Syntax)
fdiv.f32 rd:v rs1:v rs2:v
fdiv.f64 rd:vp^2 rs1:vp^2 rs2:vp^2
| 变体 | 编码 | 延迟 | 语义 | 标志 |
|---|---|---|---|---|
fdiv.f32 | R op opcode=0x24 f4=0x4 | async:sfu | d = s1 / s2(正确舍入,MODE.rm) | fm |
fdiv.f64 | R op opcode=0x24 f4=0x5 | async:sfu | d64 = s1_64 / s2_64(正确舍入) | fm p64 |